package Intermediate_algorithm.Other;

import org.junit.Test;

import java.util.Arrays;
import java.util.HashMap;

/*
多数元素
给定一个大小为 n 的数组nums ，返回其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋的元素。
你可以假设数组是非空的，并且给定的数组总是存在多数元素。

示例1：
输入：nums = [3,2,3]
输出：3
示例2：
输入：nums = [2,2,1,1,1,2,2]
输出：2

提示：
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
进阶：尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
相关标签
Java

作者：LeetCode
链接：https://leetcode.cn/leetbook/read/top-interview-questions-medium/xwnvrj/
 */
public class _03多数元素 {

    @Test
    public void test() {
        System.out.println(majorityElement(new int[]{3,2,3}));
    }

    public int majorityElement(int[] nums) {
        int n = nums.length;
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int num : nums) {
            map.put(num, map.getOrDefault(num, 0) + 1);
            if (map.get(num) > n / 2) {
                return num;
            }
        }
        return -1;
    }

    //官解：方法二：排序
    //ps：官解很多方法
    /*
    作者：力扣官方题解
    链接：https://leetcode.cn/problems/majority-element/solutions/146074/duo-shu-yuan-su-by-leetcode-solution/
     */
    class Solution {
        public int majorityElement(int[] nums) {
            Arrays.sort(nums);
            return nums[nums.length / 2];
        }
    }

}
